package cl.tinet.trainee.salas.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import cl.tinet.trainee.salas.model.ReservaSala;
import cl.tinet.trainee.salas.model.Usuario;

/**
 * 
 * Implementacion del DAO tipo usuario.
 * 
 * @author Naht-Sams
 */
public class UsuarioDao implements UsuarioDaoInterfaz {

    /**
     * Entity Manager.
     */
    private EntityManager em;

    /**
     * 
     * Constructor.
     * 
     * @param em
     *            entidad.
     */
    public UsuarioDao(EntityManager em) {
        super();
        this.em = em;
    }

    /** {@inheritDoc} */
    public void agregarUsuario(Usuario usuario) {
        em.persist(usuario);

    }

    /** {@inheritDoc} */
    public void modificarUsuario(Usuario usuario) {
        em.persist(usuario);

    }

    /** {@inheritDoc} */
    @SuppressWarnings("unchecked")
    public List<Usuario> buscarListaUsuarios() {
        String sql = "SELECT u from Usuario u";
        Query q = em.createQuery(sql);
        List<Usuario> listaUsuarios = q.getResultList();
        return listaUsuarios;
    }

    /** {@inheritDoc} */
    public void borrarUsuario(Usuario usuario) {
        em.remove(usuario);

    }

    /** {@inheritDoc} */
    public Usuario buscarUsuarioAntesDeCrear(Usuario datosUsuario) {
        Usuario usuario;
        try {
            usuario = buscarUsuario(datosUsuario);
        } catch (NoResultException e) {
            // Logger
            return null;
        }
        return usuario;
    }

    /** {@inheritDoc} */
    public Usuario buscarUsuario(Usuario datosUsuario) {
        Usuario usuario;
        usuario = null;
        String sql = "SELECT u from Usuario u where u.username=:username";
        Query q = em.createQuery(sql);
        q.setParameter("username", datosUsuario.getUsername());
        usuario = (Usuario) q.getSingleResult();
        return usuario;
    }

    /** {@inheritDoc} */
    @SuppressWarnings("unchecked")
    public List<ReservaSala> buscarReservasUsuario(Usuario usuario) {
        List<ReservaSala> listaUsuariosReserva;
        listaUsuariosReserva = null;
        String sql =
                "SELECT rs from ReservaSala rs "
                        + "where username_reserva=:username";
        Query q = em.createQuery(sql);
        q.setParameter("username", usuario.getUsername());
        listaUsuariosReserva = (List<ReservaSala>) q.getResultList();
        return listaUsuariosReserva;
    }

    /** {@inheritDoc} */
    public Usuario verificarPasswordUsuario(Usuario datosUsuario) {
        Usuario usuario;
        usuario = null;
        try {
            String sql =
                    "SELECT u from Usuario u where u.username=:username "
                            + "and u.password=:password";
            Query q = em.createQuery(sql);
            q.setParameter("username", datosUsuario.getUsername());
            q.setParameter("password", datosUsuario.getPassword());
            usuario = (Usuario) q.getSingleResult();
            return usuario;
        } catch (NoResultException e) {
            // Logger
            return null;
        }
    }

}
